#include<bits/stdc++.h>
using namespace std;
const int N = 123;
int n;
int color[N];
int countColors[N][N];
int p[N];
vector<int> g[N];
int deg[N];
void add_edge(int x, int y)
{
g[x].push_back(y);
g[y].push_back(x);
}
bool tryTwoColors()
{
int v1 = n + 1;
int v2 = n + 2;
for(int i = 2; i <= n; i++)
{
if(p[i] != 1)
{
add_edge(i, p[i]);
}
}
for(int i = 2; i <= n; i++)
{
if(deg[i] == 1)
add_edge(i, v1);
}
for(int i = 2; i <= n; i++)
{
if(p[i] != 1 && deg[p[i]] == 1)
add_edge(i, v2);
}
add_edge(v1, v2);
bool bad = false;
for(int i = 2; i <= n + 2; i++)
if(color[i] == 0)
{
color[i] = 1;
queue<int> q;
q.push(i);
while(!q.empty())
{
int k = q.front();
q.pop();
for(auto y : g[k])
{
if(color[y] == 0)
{
color[y] = 3 - color[k];
q.push(y);
}
else if(color[y] == color[k])
bad = true;
}
}
}
if(bad)
for(int i = 2; i <= n + 2; i++)
color[i] = 0;
return !bad;
}
void tryThreeColors()
{
for(int i = 2; i <= n; i++)
if(p[i] == 1)
color[i] = 1;
else
color[i] = (color[p[i]] % 3) + 1;
}
int findVertex(const vector<int>& colors)
{
int s = colors.size();
for(int i = 2; i <= n; i++)
{
if(vector<int>(countColors[i], countColors[i] + s) == colors)
return i;
}
return -1;
}
int main()
{
cin >> n;
for(int i = 2; i <= n; i++)
{
cin >> p[i];
deg[p[i]]++;
}
if(*max_element(p + 2, p + n + 1) == 1)
{
for(int i = 2; i <= n; i++)
color[i] = 1;
}
else if (!tryTwoColors())
tryThreeColors();
int colorsUsed = *max_element(color + 2, color + n + 1);
cout << colorsUsed << endl;
for(int i = 2; i <= n; i++)
{
cout << color[i];
if(i == n) cout << endl;
else cout << " ";
}
cout.flush();
for(int i = 2; i <= n; i++)
{
countColors[i][color[i]]++;
countColors[p[i]][color[i]]++;
}
while(true)
{
int resp;
cin >> resp;
if(resp == -1 || resp == 1)
exit(0);
vector<int> counts(colorsUsed + 1);
for(int i = 1; i <= colorsUsed; i++)
cin >> counts[i];
int v = findVertex(counts);
assert(v != -1);
cout << color[v] << endl;
cout.flush();
}
}
1523B - Lord of the Values | 1406C - Link Cut Centroids |
2409. Count Days Spent Together | 2410. Maximum Matching of Players With Trainers |
1604C - Di-visible Confusion | 997A - Convert to Ones |
218A - Mountain Scenery | 486B - OR in Matrix |
1405A - Permutation Forgery | 1733A - Consecutive Sum |
1733B - Rule of League | 1733C - Parity Shuffle Sorting |
1264A - Beautiful Regional Contest | 1695A - Subrectangle Guess |
467B - Fedor and New Game | 252C - Points on Line |
735C - Tennis Championship | 992A - Nastya and an Array |
554A - Kyoya and Photobooks | 79B - Colorful Field |
265B - Roadside Trees (Simplified Edition) | 1362C - Johnny and Another Rating Drop |
1214C - Bad Sequence | 1091B - New Year and the Treasure Geolocation |
244A - Dividing Orange | 1061C - Multiplicity |
1312A - Two Regular Polygons | 801A - Vicious Keyboard |
510B - Fox And Two Dots | 616D - Longest k-Good Segment |